package com.jt.service;

import com.jt.mapper.UserMapper;
import com.jt.pojo.User;
import com.jt.vo.PageResult;
import com.sun.glass.ui.Size;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.DigestUtils;

import java.util.Date;
import java.util.List;
import java.util.UUID;

@Service
public class UserServiceImpl implements UserService{

    @Autowired
    private UserMapper userMapper;

    @Override
    public List<User> findAll() {
        return userMapper.findAll();
    }

    /**
     * 思路：
     *    user数据：User(id=null, username=abc, password=admin123456, phone=null, email=null, status=null)
     *    1.将密码明文，转化为密文  sha1/md5算法/mdhash
     *    2.根据用户名和密码查询用户信息
     *    3.有结果：返回token  UUID
     *    4.没有结果：返回null
     * @param user
     * @return
     */

    @Override
    public String login(User user) {
        String password = user.getPassword();
        byte[] bytes = password.getBytes();
        //1.将密码加密
        String md5Password = DigestUtils.md5DigestAsHex(bytes);
        user.setPassword(md5Password);
        //2.根据用户名和密码查询数据库
        User userDB = userMapper.finUserByUP(user);
        //3.判断userDB是否有值
        if (userDB == null){
            //用户名和密码查询错误
             return null;
        }
            //程序到这里，说明用户名和密码正确，返回token
        String token = UUID.randomUUID().toString();
        return token;
    }

    /**
     * 分页查询的sql：
     * SELECT * FROM USER LIMIT 起始位置,查询条数
     * 第一页：每页10条
     * SELECT * FROM USER LIMIT 0,10   [0,10)
     * 第二页：每页10条
     * SELECT * FROM USER LIMIT 10,10
     * 第n页：每页10条
     * SELECT * FROM USER LIMIT (n-1)*10,10
     * @param pageResult
     * @return
     */
    @Override
    public PageResult findUserList(PageResult pageResult) {
        //1.分页总记录数
        Long total = userMapper.findTotal();
        //2.获取分页查询的结果
        int size = pageResult.getPageSize();
        int start = (pageResult.getPageNum() - 1) * size;
        String query = pageResult.getQuery();
        List<User> rows= userMapper.findUserList(start,size,query);
        return pageResult.setTotal(total).setRows(rows);
    }

    /**
     * 需求：修改状态信息
     * 参数：id/status/update修改时间
     * @param user
     */
    @Override
    @Transactional
    public void updateStatus(User user) {
        user.setUpdated(new Date());//设定当前时间
        userMapper.updateStatus(user);
    }

    //删除用户信息
    @Override
    @Transactional
    public void deleteUser(int id) {
        userMapper.deleteUser(id);
    }

    //用户新增
    @Override
    @Transactional  //事务控制的注解，同时也可以控制异常回滚
//    @Transactional(rollbackFor = Exception.class)  //只要有异常,则全部回滚.
//    如果采用上述的代码,则AOP拦截所有的异常,运行效率低. 所以一般只拦截运行时异常.检查异常由程序员手动控制.
    public void addUser(User user) {
        //密码加密
        String password = user.getPassword();
        String md5Pass = DigestUtils.md5DigestAsHex(password.getBytes());
        user.setPassword(md5Pass).setStatus(true).setCreated(new Date())
                .setUpdated(user.getCreated());
        userMapper.addUser(user);
    }

    //通过id查询用户
    @Override
    public User findUserById(Integer id) {

        return userMapper.findUserById(id);
    }

    //用户修改
    @Override
    @Transactional
    public void updateUser(User user) {

        user.setUpdated(new Date());
        userMapper.updateUser(user);
    }


}
